package com.divemotor.ventarepuestosinternet.dao.impl;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;

import com.divemotor.ventarepuestosinternet.dao.GenericoSinEstadoDAO;

public abstract class GenericoSinEstadoDAOImpl<E, ID extends Serializable> implements GenericoSinEstadoDAO<E, ID> {

	protected Class<E> clase;

	/*protected void setClase(final Class<E> clase) {
		this.clase = clase;
	}*/
	
	public GenericoSinEstadoDAOImpl() {
        Type t = getClass().getGenericSuperclass();
        ParameterizedType pt = (ParameterizedType) t;
        clase = (Class) pt.getActualTypeArguments()[0];
    }
	
	protected void setClase(final Class<E> clase) {
		 this.clase = clase;
	}
	
	@Autowired
	SessionFactory sessionFactory;

	@Override
	public E insertar(E entidad) {
		sessionFactory.getCurrentSession().persist(entidad);
		return entidad;
	}

	@Override
	public void eliminar(E entidad) {
		sessionFactory.getCurrentSession().delete(entidad);
	}

	@Override
	public void actualizar(E entidad) {

		sessionFactory.getCurrentSession().merge(entidad);

	}

	@Override
	public E obtenerPorId(ID id) {
		return (E) sessionFactory.getCurrentSession().get(clase, id);
	}

	@Override
	public List<E> listarTodos() {
		return sessionFactory
				.getCurrentSession()
				.createCriteria(clase)
				.list();
	}

	@Override
	public List<E> listarPorPropiedad(String propiedad, Object value) {
		return sessionFactory
				.getCurrentSession()
				.createCriteria(clase)
				.add(Restrictions.eq(propiedad, value)).list();
	}
	
	

}
